package UndoRedo;
import java.util.Stack;
import Notification.NotificationCenter;
import Notification.NotificationMessageT;
import Window.MOCBuilder;
public class LDrawUndoRedoManager {
private static LDrawUndoRedoManager _instance = null;
private Stack<IAction> undoActionStack;
private Stack<IAction> redoActionStack;
private final int stackSize = 100;
private LDrawUndoRedoManager() {
undoActionStack = new Stack<IAction>();
redoActionStack = new Stack<IAction>();
NotificationCenter.getInstance().postNotification(
NotificationMessageT.UndoRedoManagerUpdated);
}
public synchronized static LDrawUndoRedoManager getInstance() {
if (_instance == null)
_instance = new LDrawUndoRedoManager();
return _instance;
}
public void pushUndoAction(IAction action) {
MOCBuilder.getInstance().setChanged();
undoActionStack.push(action);
if (undoActionStack.size() > stackSize * 2)
for (int i = 0; i < stackSize; i++)
undoActionStack.remove(i);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.UndoRedoManagerUpdated);
}
public void undo() {
if (undoActionStack.isEmpty())
return;
IAction action = undoActionStack.pop();
if (action == null)
return;
action.undoAction();
redoActionStack.push(action);
if (redoActionStack.size() > stackSize * 2)
for (int i = 0; i < stackSize; i++)
redoActionStack.remove(i);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.UndoRedoManagerUpdated);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
public void redo() {
if (redoActionStack.isEmpty())
return;
IAction action = redoActionStack.pop();
if (action == null)
return;
action.redoAction();
undoActionStack.push(action);
if (undoActionStack.size() > stackSize * 2)
for (int i = 0; i < stackSize; i++)
undoActionStack.remove(i);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.UndoRedoManagerUpdated);
NotificationCenter.getInstance().postNotification(
NotificationMessageT.NeedReDraw);
}
public void clear() {
undoActionStack.clear();
redoActionStack.clear();
NotificationCenter.getInstance().postNotification(
NotificationMessageT.UndoRedoManagerUpdated);
}
public boolean isEmptyRedoStack() {
return this.redoActionStack.isEmpty();
}
public boolean isEmptyUndoStack() {
return this.undoActionStack.isEmpty();
}
}